package com.heima.user.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDTO;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

@Service
@Transactional
@Slf4j
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService{
    /**
     * 通过作者id获取作者姓名
     *
     * @param authId
     * @return
     */
    @Override
    public String getAuthNameById(Integer authId) {
        ApUser user = getById(authId);
        return user.getName();
    }

    /**
     * app端登录功能
     *
     * @param loginDTO
     */
    @Override
    public ResponseResult login(LoginDTO loginDTO) {
        //1.正常登录（手机号+密码）
        if(!(StringUtils.isEmpty(loginDTO.getPhone())) && !(StringUtils.isEmpty(loginDTO.getPassword()))){
            //账号密码不为空
            //根据手机号查询用户信息
            ApUser apUser = lambdaQuery().eq(ApUser::getPhone, loginDTO.getPhone()).one();
            //如果用户为空，抛出用户不存在的异常
            if(apUser== null){
                //用户不存在
                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
            }


            String salt = apUser.getSalt();
            String password = apUser.getPassword();

            //2.对比密码
            //将明文密码加密处理
            String pswd = DigestUtils.md5DigestAsHex((loginDTO.getPassword() + salt).getBytes());

            //密码错误，则返回密码错误信息
            if(!pswd.equals(password)){
                //密码错误
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }

            //3.返回数据 jwt
            //map封装
            Map<String,Object> map = new HashMap<>();
            //存放token 和 用户信息
            //token
            map.put("token", AppJwtUtil.getToken(apUser.getId().longValue()));
            //用户信息
            apUser.setPassword("");
            apUser.setSalt("");
            map.put("user", apUser);
            return ResponseResult.okResult(map);
        }
        else{
            //游客登录
            Map<String,Object> map = new HashMap<>();
            map.put("token",AppJwtUtil.getToken(0L));
            return ResponseResult.okResult(map);
        }
    }
}
